home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / MotifInternalFrameTitlePane.java < prev    next >
Text File  |  1998-06-30  |  14KB  |  399 lines

  1. /*
  2.  * @(#)MotifInternalFrameTitlePane.java    1.7 98/04/10
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.motif;
  22.  
  23. import java.awt.*;
  24. import java.awt.event.*;
  25. import com.sun.java.swing.*;
  26. import com.sun.java.swing.border.*;
  27. import com.sun.java.swing.event.InternalFrameEvent;
  28. import java.util.EventListener;
  29. import java.beans.PropertyChangeListener;
  30. import java.beans.PropertyChangeEvent;
  31. import java.beans.VetoableChangeListener;
  32. import java.beans.PropertyVetoException;
  33.  
  34. /**
  35.  * Package private class that manages a Motif title bar
  36.  * @version 1.7 04/10/98
  37.  */
  38. class MotifInternalFrameTitlePane 
  39.     extends JComponent implements LayoutManager, ActionListener, PropertyChangeListener 
  40. {
  41.     SystemButton systemButton;
  42.     MinimizeButton minimizeButton;
  43.     MaximizeButton maximizeButton;
  44.     JPopupMenu systemMenu;
  45.     Title title;
  46.     JInternalFrame iFrame;
  47.     Color color;
  48.     Color highlight;
  49.     Color shadow;
  50.  
  51.     static final Font defaultTitleFont = new Font("SansSerif", Font.PLAIN, 12);
  52.  
  53.     // The width and height of a title pane button
  54.     public final static int BUTTON_SIZE = 19;  // 17 + 1 pixel border
  55.  
  56.     final int RESTORE_MENU_ITEM = 0;
  57.     final int MOVE_MENU_ITEM = 1;
  58.     final int SIZE_MENU_ITEM = 2;
  59.     final int MINIMIZE_MENU_ITEM = 3;
  60.     final int MAXIMIZE_MENU_ITEM = 4;
  61.     final int SEPARATOR_MENU_ITEM = 5;
  62.     final int CLOSE_MENU_ITEM = 6;
  63.     
  64.     public MotifInternalFrameTitlePane(JInternalFrame f) {
  65.     iFrame = f;
  66.     
  67.     setPreferredSize(new Dimension(100, BUTTON_SIZE));
  68.  
  69.     systemMenu = new JPopupMenu() {
  70.             public void show(Component invoker, int x, int y) {
  71.                 if(!iFrame.isIconifiable())
  72.                     systemMenu.getComponentAtIndex(MINIMIZE_MENU_ITEM).setEnabled(false);
  73.                 if(!iFrame.isMaximizable()) 
  74.                     systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(false);
  75.                 if(!iFrame.isMaximizable() && !iFrame.isIconifiable()) 
  76.                     systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(false);
  77.                 if(!iFrame.isClosable())    
  78.                     systemMenu.getComponentAtIndex(CLOSE_MENU_ITEM).setEnabled(false);
  79.                 super.show(invoker, x, y);
  80.             }
  81.         };
  82.     
  83.     JMenuItem mi = (JMenuItem) systemMenu.add(new JMenuItem("Restore"));
  84.     mi.setEnabled(false);
  85.     mi.addActionListener(this);
  86.     /// PENDING(klobad) Move/Size actions on InternalFrame need to be determined
  87.     mi = (JMenuItem) systemMenu.add(new JMenuItem("Move"));
  88.     mi.setEnabled(false);
  89.     mi.addActionListener(this);
  90.     mi = (JMenuItem) systemMenu.add(new JMenuItem("Size"));
  91.     mi.setEnabled(false);
  92.     mi.addActionListener(this);
  93.     mi = (JMenuItem) systemMenu.add(new JMenuItem("Minimize"));
  94.     mi.addActionListener(this);
  95.     mi = (JMenuItem) systemMenu.add(new JMenuItem("Maximize"));
  96.     mi.addActionListener(this);
  97.     systemMenu.add(new JSeparator());
  98.     mi = (JMenuItem) systemMenu.add(new JMenuItem("Close"));
  99.     mi.addActionListener(this); 
  100.     
  101.         systemButton = new SystemButton();
  102.     systemButton.addActionListener(new ActionListener() {
  103.             public void actionPerformed(ActionEvent e) {
  104.                 systemMenu.show(systemButton, 0, BUTTON_SIZE);
  105.             }
  106.         });
  107.         systemButton.addMouseListener(new MouseAdapter() {
  108.             public void mousePressed(MouseEvent e) {
  109.                 if (e.getClickCount() == 2) {
  110.                     postClosingEvent(iFrame);
  111.                     systemMenu.setVisible(false);
  112.                 }
  113.             }
  114.         });
  115.  
  116.     minimizeButton = new MinimizeButton();
  117.     minimizeButton.addActionListener(this);
  118.     minimizeButton.setActionCommand("Iconify");
  119.  
  120.     maximizeButton = new MaximizeButton();
  121.     maximizeButton.addActionListener(this);
  122.     maximizeButton.setActionCommand("Maximize");
  123.  
  124.         title = new Title(iFrame.getTitle());
  125.         title.setFont(defaultTitleFont);
  126.  
  127.     setLayout(this);
  128.  
  129.     add(systemButton);
  130.         add(title);
  131.     add(minimizeButton);
  132.     add(maximizeButton);
  133.  
  134.     // Make sure these are ok to leave on?
  135.     iFrame.addPropertyChangeListener(this);
  136.     }
  137.  
  138.     /**
  139.      * Post a WINDOW_CLOSING-like event to the frame, so that it can
  140.      * be treated like a regular Frame.
  141.      */
  142.     void postClosingEvent(JInternalFrame frame) {
  143.         InternalFrameEvent e = new InternalFrameEvent(
  144.             frame, InternalFrameEvent.INTERNAL_FRAME_CLOSING);
  145.         // Try posting event, unless there's a SecurityManager.
  146.         if (JInternalFrame.class.getClassLoader() == null) {
  147.             try {
  148.                 Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e);
  149.                 return;
  150.             } catch (SecurityException se) {
  151.                 // Use dispatchEvent instead.
  152.             }
  153.         }
  154.         frame.dispatchEvent(e);
  155.     }
  156.  
  157.     void setColors(Color c, Color h, Color s) {
  158.         color = c;
  159.         highlight = h;
  160.         shadow = s;
  161.     }
  162.  
  163.     JPopupMenu getSystemMenu() {
  164.         return systemMenu;
  165.     }
  166.  
  167.     public void actionPerformed(ActionEvent e) {
  168.         try {
  169.             if ("Close".equals(e.getActionCommand()) && iFrame.isClosable()) {
  170.                 postClosingEvent(iFrame);
  171.             } else if ("Iconify".equals(e.getActionCommand()) && 
  172.                      iFrame.isIconifiable()) {
  173.                 if (!iFrame.isIcon()) {
  174.                     iFrame.setIcon(true); 
  175.                 } else {
  176.                     iFrame.setIcon(false); 
  177.                 }
  178.             } else if ("Minimize".equals(e.getActionCommand()) && 
  179.                        iFrame.isMaximizable()) {
  180.                 iFrame.setIcon(true);
  181.             } else if ("Maximize".equals(e.getActionCommand()) && 
  182.                        iFrame.isMaximizable()) {
  183.                 if(!iFrame.isMaximum()) {
  184.                     iFrame.setMaximum(true);
  185.                 } else {
  186.                     iFrame.setMaximum(false);
  187.                 }
  188.             } else if ("Restore".equals(e.getActionCommand()) && 
  189.                        iFrame.isMaximizable() && iFrame.isMaximum()) {
  190.                 iFrame.setMaximum(false);
  191.             } else if ("Restore".equals(e.getActionCommand()) && 
  192.                        iFrame.isIconifiable() && iFrame.isIcon()) {
  193.                 iFrame.setIcon(false);
  194.             }
  195.         } catch (PropertyVetoException e0) { }
  196.  
  197.         // Dismiss popup menu if it's displayed
  198.         if (systemMenu.isVisible()) {
  199.             systemMenu.setVisible(false);
  200.         }
  201.     }
  202.  
  203.     public void propertyChange(PropertyChangeEvent evt) {
  204.     String prop = (String)evt.getPropertyName();
  205.     JInternalFrame f = (JInternalFrame)evt.getSource();
  206.     boolean value = false;
  207.     if(JInternalFrame.IS_SELECTED_PROPERTY.equals(prop)) {
  208.         repaint();
  209.     } else if(JInternalFrame.IS_MAXIMUM_PROPERTY.equals(prop)) {
  210.         value = ((Boolean)evt.getNewValue()).booleanValue();
  211.         systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(value); 
  212.         systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(!value); 
  213.     } else if(JInternalFrame.IS_ICON_PROPERTY.equals(prop)) {
  214.         value = ((Boolean)evt.getNewValue()).booleanValue();
  215.         systemMenu.getComponentAtIndex(RESTORE_MENU_ITEM).setEnabled(value); 
  216.         systemMenu.getComponentAtIndex(MAXIMIZE_MENU_ITEM).setEnabled(!value); 
  217.         systemMenu.getComponentAtIndex(MINIMIZE_MENU_ITEM).setEnabled(!value); 
  218.     } 
  219.     }
  220.  
  221.     public void addLayoutComponent(String name, Component c) {}
  222.     public void removeLayoutComponent(Component c) {}    
  223.     public Dimension preferredLayoutSize(Container c)  {
  224.     return new Dimension(c.getSize().width, BUTTON_SIZE);
  225.     }
  226.     
  227.     public Dimension minimumLayoutSize(Container c) {
  228.     return new Dimension(c.getSize().width, BUTTON_SIZE);
  229.     }
  230.     
  231.     public void layoutContainer(Container c) {
  232.     int w = getWidth();
  233.     systemButton.setBounds(0, 0, BUTTON_SIZE, BUTTON_SIZE);
  234.     int x = w - BUTTON_SIZE;
  235.  
  236.     if(iFrame.isMaximizable()) {
  237.         maximizeButton.setBounds(x, 0, BUTTON_SIZE, BUTTON_SIZE);
  238.         x -= BUTTON_SIZE;
  239.     } else if(maximizeButton.getParent() != null) {
  240.         maximizeButton.getParent().remove(maximizeButton);
  241.     }
  242.         
  243.     if(iFrame.isIconifiable()) {
  244.         minimizeButton.setBounds(x, 0, BUTTON_SIZE, BUTTON_SIZE);
  245.         x -= BUTTON_SIZE;
  246.     } else if(minimizeButton.getParent() != null) {
  247.         minimizeButton.getParent().remove(minimizeButton);
  248.     }
  249.  
  250.         title.setBounds(BUTTON_SIZE, 0, x, BUTTON_SIZE);
  251.     }
  252.  
  253.     static Dimension buttonDimension = new Dimension(BUTTON_SIZE, BUTTON_SIZE);
  254.  
  255.     private abstract class FrameButton extends JButton {
  256.  
  257.         FrameButton() {
  258.             super();
  259.             setFocusPainted(false);     
  260.             setBorderPainted(false);
  261.         }
  262.  
  263.         public boolean isFocusTraversable() { 
  264.             return false; 
  265.         }
  266.  
  267.         public void requestFocus() {
  268.             // ignore request.
  269.         }
  270.  
  271.         public Dimension getMinimumSize() {
  272.             return buttonDimension;
  273.         }
  274.  
  275.         public Dimension getPreferredSize() {
  276.             return buttonDimension;
  277.         }
  278.  
  279.         public void paint(Graphics g) {
  280.             Dimension d = getSize();
  281.             int maxX = d.width - 1;
  282.             int maxY = d.height - 1;
  283.  
  284.             // draw background
  285.             g.setColor(color);
  286.             g.fillRect(1, 1, d.width, d.height);
  287.  
  288.             // draw border
  289.             boolean pressed = getModel().isPressed();
  290.             g.setColor(pressed ? shadow : highlight);
  291.             g.drawLine(0, 0, maxX, 0);
  292.             g.drawLine(0, 0, 0, maxY);
  293.             g.setColor(pressed ? highlight : shadow);
  294.             g.drawLine(1, maxY, maxX, maxY);
  295.             g.drawLine(maxX, 1, maxX, maxY);
  296.         }
  297.     }
  298.     
  299.     private class MinimizeButton extends FrameButton {
  300.         public void paint(Graphics g) {
  301.             super.paint(g); 
  302.             g.setColor(highlight);
  303.             g.drawLine(7, 8, 7, 11);
  304.             g.drawLine(7, 8, 10, 8);
  305.             g.setColor(shadow);
  306.             g.drawLine(8, 11, 10, 11);
  307.             g.drawLine(11, 9, 11, 11);
  308.         }
  309.     }
  310.  
  311.     private class MaximizeButton extends FrameButton {
  312.         public void paint(Graphics g) {
  313.             super.paint(g); 
  314.             int max = BUTTON_SIZE - 5;
  315.             boolean isMaxed = iFrame.isMaximum();
  316.             g.setColor(isMaxed ? shadow : highlight);
  317.             g.drawLine(4, 4, 4, max);
  318.             g.drawLine(4, 4, max, 4);
  319.             g.setColor(isMaxed ? highlight : shadow);
  320.             g.drawLine(5, max, max, max);
  321.             g.drawLine(max, 5, max, max);
  322.         }
  323.     }
  324.  
  325.     private class SystemButton extends FrameButton {
  326.         public boolean isFocusTraversable() { return false; }
  327.         public void requestFocus() {}
  328.  
  329.         public void paint(Graphics g) {
  330.             super.paint(g);
  331.             g.setColor(highlight);
  332.             g.drawLine(4, 8, 4, 11);
  333.             g.drawLine(4, 8, BUTTON_SIZE - 5, 8);
  334.             g.setColor(shadow);
  335.             g.drawLine(5, 11, BUTTON_SIZE - 5, 11);
  336.             g.drawLine(BUTTON_SIZE - 5, 9, BUTTON_SIZE - 5, 11);
  337.         }
  338.     }
  339.  
  340.     private class Title extends FrameButton {
  341.         Title(String title) {
  342.             super();
  343.             setText(title);
  344.             setHorizontalAlignment(SwingConstants.CENTER);
  345.             setBorder(BorderFactory.createBevelBorder(
  346.                 BevelBorder.RAISED,
  347.                 UIManager.getColor("activeCaptionBorder"),
  348.                 UIManager.getColor("inactiveCaptionBorder")));
  349.  
  350.             // Forward mouse events to titlebar for moves.
  351.             addMouseMotionListener(new MouseMotionListener() {
  352.                 public void mouseDragged(MouseEvent e) {
  353.                     forwardEventToParent(e);
  354.                 }
  355.                 public void mouseMoved(MouseEvent e) {
  356.                     forwardEventToParent(e);
  357.                 }
  358.             });
  359.             addMouseListener(new MouseListener() {
  360.                 public void mouseClicked(MouseEvent e) {
  361.                     forwardEventToParent(e);
  362.                 }
  363.                 public void mousePressed(MouseEvent e) {
  364.                     forwardEventToParent(e);
  365.                 }
  366.                 public void mouseReleased(MouseEvent e) {
  367.                     forwardEventToParent(e);
  368.                 }
  369.                 public void mouseEntered(MouseEvent e) {
  370.                     forwardEventToParent(e);
  371.                 }
  372.                 public void mouseExited(MouseEvent e) {
  373.                     forwardEventToParent(e);
  374.                 }
  375.             });
  376.         }
  377.  
  378.         void forwardEventToParent(MouseEvent e) {
  379.             getParent().dispatchEvent(new MouseEvent(
  380.                 getParent(), e.getID(), e.getWhen(), e.getModifiers(),
  381.                 e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger()));
  382.         }
  383.  
  384.         public void paint(Graphics g) {
  385.             super.paint(g);
  386.             if (iFrame.isSelected()) {
  387.                 g.setColor(UIManager.getColor("activeCaptionText"));
  388.             } else {
  389.                 g.setColor(UIManager.getColor("inactiveCaptionText"));
  390.             }
  391.             Dimension d = getSize();
  392.             MotifGraphicsUtils.drawStringInRect(g, iFrame.getTitle(),
  393.                                                 0, 0, d.width, d.height,
  394.                                                 SwingConstants.CENTER);
  395.         }
  396.     }
  397.  
  398. }    /// End Title Pane Class
  399.